//
//  ChinseseMarker.swift
//  Easydict
//
//  Created by tisfeng on 2025/3/30.
//  Copyright © 2025 izual. All rights reserved.
//

import Foundation

// MARK: - ClassicalText

// A collection of linguistic features and markers for classical Chinese, genertated by AI.

// MARK: - ClassicalMarker

enum ChinseseMarker {
    /// Common features shared across all classical Chinese types
    enum Common {
        // Common line separators
        static let lineSeparators = ["\n", "。", "，", "？", "！", "；", "、"]

        /// Meta characters for titles, authors and dynasties.
        static let metaPunctuationCharacters = [
            "《", "》", "—", "•", "·", "-", "〔", "〕", "#",
        ]

        static let bracketPairs = [
            ("【", "】"), ("〔", "〕"), ("［", "］"), ("[", "]"),
            ("(", ")"), ("（", "）"),
        ]

        // Dynasty markers
        /// 朝代名称，按照时间先后顺序排列
        /// Refer: https://zh.wikipedia.org/wiki/中国朝代
        static let dynastyMarkers = [
            // 春秋战国
            "夏", "商", "周", "西周", "东周", "春秋", "战国", "春秋战国",

            // 秦汉时期
            "秦", "先秦", "秦汉",
            "两汉", "西汉", "东汉", "前汉", "后汉",

            // 三国两晋南北朝
            "三国", "魏蜀吴", "魏晋",
            "魏", "蜀", "吴",
            "两晋", "西晋", "东晋",
            "南北朝",
            "南朝", // "宋齐梁陈",
            "北朝", //  "北魏东魏西魏北齐北周",
            // 南朝
            "南朝宋", "南朝齐", "南朝梁", "南朝陈",
            // 北朝
            "北魏", "东魏", "西魏", "北齐", "北周",

            // 隋唐五代
            "隋", "隋唐",
            "唐",
            "五代十国", "五代",
            // 五代
            "后梁", "后唐", "后晋", "后汉", "后周",
            // 十国
            "前蜀", "后蜀", "南吴", "南唐", "吴越",
            "闽", "南汉", "南平", "荆南", "北汉",

            // 宋辽金元
            "宋", "北宋", "南宋",
            "辽", "金", "元", "西夏",

            // 明清
            "明清",
            "明", "南明",
            "清",

            // 近现代
            "民国", "近代", "现代", "当代",
        ]
    }

    /// Classical prose specific features
    enum Prose {
        // Classical prose particles and function words
        static let particles = [
            // Basic particles (虚词)
            "之", "乎", "焉", "哉", "耳", "兮", "邪", "欤", "歟",
            "矣", "耶", "夫", "盖", "蓋", "亦", "莫",

            // Common function words (连词、介词等)
            "诸", "諸", "弗", "斯", "迨", "遂", "惟", "尚", "固",
            "盖", "蓋", "傥", "儻", "倘", "偶", "猶", "庶", "嘗",

            // Classical pronouns (代词)
            "吾", "予", "余", "汝", "尔", "爾", "彼", "伊", "厥",
            "維", "兹", "茲", "玆", "孰", "諸", "某",

            // Additional variants (传统变体)
            "噫", "嗟", "豈", "誠", "咨", "恭",

            // Others
            "勿", "毋", "乃",
        ]

        // Common prose title patterns
        static let titlePatterns = [
            "传", "志", "录", "记", "赋", "论", "说", "序", "跋",
            "书", "檄", "表", "奏", "议", "注", "解", "章",
        ]
    }

    /// Classical poetry specific features
    enum Poetry {
        // Poetry title patterns
        static let titlePatterns = [
            "诗", "吟", "咏", "题", "歌", "行", "诗", "古风", "古诗",
            "五言", "七言", "绝句", "律诗", "长诗", "排律",
        ]

        // Common location markers in poetry titles
        static let locationMarkers = [
            "山中", "江上", "寺中", "楼上", "亭", "台", "楼", "轩",
            "东", "西", "南", "北", "春", "夏", "秋", "冬",
        ]
    }

    /**
     声调有阴平、阳平、上声、去声四声。

     平韵：阴平、阳平（第一声、第二声）
     仄韵：上声、去声（第三声、第四声）

     同一个韵部中，平声韵和仄声韵交替使用，又称为叶韵

     https://zhuanlan.zhihu.com/p/53158022
     */

    enum LyricPoetry {
        /// 词牌名及其详细信息 (含主要变体和独立别名条目)
        /// 主要参考来源：
        /// - 56 种常见词牌名：https://wapbaike.baidu.com/tashuo/browse/content?id=d0746a7dc421fce32626320d
        /// - 词牌名总览：https://baike.baidu.com/item/%E8%AF%8D%E7%89%8C%E5%90%8D/475980
        /// 注释格式：
        /// "词牌名": [字数 1, 字数 2...], // [格律信息]。[作者]《[代表作]》
        /// "别名": [字数 1, 字数 2...], // 《原词牌名》别名。[作者]《[代表作 (若以此别名著称)]》
        /// 变体格式：
        /// "词牌名": [
        ///     字数 1, // [变体 1 描述]。
        ///     字数 2, // [变体 2 描述]。
        /// ],
        static let tunePatterns: [String: [Int]] = [
            // MARK: - 小令 (<= 58 字)

            "忆江南": [27], // 单调，二十七字，五句，三平韵。唐·白居易《忆江南·江南好》
            "渔歌子": [27], // 单调，二十七字，五句，四平韵。唐·张志和《渔歌子·西塞山前白鹭飞》
            "捣练子": [27], // 单调，二十七字，五句，三平韵。李煜《捣练子令·深院静》
            "如梦令": [
                33, // [单调正体]: 三十三字，七句，五仄韵，一叠韵。宋·李清照《如梦令·常记溪亭日暮》。
                66, // [双调]: 六十六字，上下片各七句，五仄韵，一叠韵。
            ],
            "南柯子": [
                23, // [23 字单调]: 温庭筠体，五句，三平韵。温庭筠《南歌子·手里金鹦鹉》。
                52, // [52 字双调]: 欧阳修体，上下阕各四句，三平韵。欧阳修《南歌子·凤髻金泥带》，仲殊《南柯子·十里青山远》
            ],
            "相见欢": [36], // 双调，三十六字，前阕三平韵，后阕两仄韵、两平韵。南唐·李煜《相见欢·无言独上西楼》
            "长相思": [36], // 双调，三十六字，前后片各三平韵，一叠韵。宋·林逋《长相思·吴山青》
            "生查子": [40], // 双调，四十字，上下片各两仄韵。宋·欧阳修《生查子·去年元夜时》
            "点绛唇": [41], // 双调，四十一字，上阕四句三仄韵，下阕五句四仄韵。宋·李清照《点绛唇·蹴罢秋千》
            "浣溪沙": [42], // 双调，四十二字，上片三平韵，下片两平韵。宋·晏殊《浣溪沙·一曲新词酒一杯》
            "菩萨蛮": [44], // 双调，四十四字，上下阕各四句，两仄韵。唐·李白《菩萨蛮·平林漠漠烟如织》
            "卜算子": [44], // 双调，四十四字，上下片各两仄韵。宋·苏轼《卜算子·缺月挂疏桐》
            "采桑子": [44], // 双调，四十四字，上下片各四句，三平韵。宋·辛弃疾《采桑子·少年不识愁滋味》
            "减字木兰花": [44], // 双调，四十四字，上下片各四句，两仄韵两平韵。宋·李清照《减字木兰花·卖花担上》
            "谒金门": [45], // 双调，四十五字，上下片各四句、四仄韵。南唐·冯延巳《谒金门·风乍起》
            "诉衷情": [
                33, // [单调正体]: 单调，三十三字，十一句，五仄韵，六平韵。以温庭筠《诉衷情·莺语》
                33, // [单调变体]: 三十三字，九句，六平韵两仄韵。韦庄《诉衷情·碧沼红芳烟雨静》
                44, // [双调正体]: 四十四字，上片四句三平韵，下片六句三平韵。宋·陆游《诉衷情·当年万里觅封侯》。
            ],
            "清平乐": [46], // 双调，四十六字，前阕四句四仄韵，后阕四句三平韵，平仄换韵。宋·辛弃疾《清平乐·村居》
            "更漏子": [46], // 双调，四十六字，前片六句两仄韵、两平韵，后片六句三仄韵、两平韵。温庭筠《更漏子·玉炉香》
            "忆秦娥": [46], // 双调，四十六字，前后片各三仄韵，一叠韵。唐·李白《忆秦娥·箫声咽》
            "阮郎归": [47], // 双调，四十七字，前后片各四平韵。宋·苏轼《阮郎归·初夏》
            "画堂春": [47], // 双调，四十七字，前片四平韵，后片三平韵。清·纳兰容若《画堂春·一生一代一双人》
            "西江月": [50], // 双调，五十字，上下阕各四句，两平韵两叶韵。宋·辛弃疾《西江月·明月别枝惊鹊》
            "少年游": [50], // 双调，五十字，前片三平韵，后片两平韵。(按用户提供的柳永体描述)。宋·柳永《少年游·长安古道马迟迟》
            "醉花阴": [52], // 双调，五十二字，上下阕各五句，各三仄韵。宋·李清照《醉花阴·薄雾浓云愁永昼》
            "浪淘沙": [54], // 双调，五十四字，前后片各四平韵。(按用户提供的令词体描述)。南唐·李煜《浪淘沙令·帘外雨潺潺》
            "鹧鸪天": [55], // 双调，五十五字，前段四句三平韵，后段五句三平韵。宋·晏几道《鹧鸪天·彩袖殷勤捧玉钟》
            "鹊桥仙": [56], // 双调，五十六字，前后阕各两仄韵，一韵到底。宋·秦观《鹊桥仙·纤云弄巧》
            "虞美人": [56], // 双调，五十六字，上下片各四句，两仄韵转两平韵。南唐·李煜《虞美人·春花秋月何时了》
            "南乡子": [56], // 双调，五十六字，前后阕各四平韵，一韵到底。宋·辛弃疾《南乡子·何处望神州》
            "木兰花": [
                55, // [55 字体]: 双调，五十五字，上阕五句三仄韵，下阕四句三仄韵。韦庄《木兰花·独上小楼春欲暮》
                56, // [56 字变体]: 双调，五十六字，上下阕各四句。纳兰性德《木兰花·拟古决绝词》
            ],
            "玉楼春": [ // 《木兰花》别名
                56, // 双调，五十六字，上下阕各四句，三仄韵。欧阳修《玉楼春·尊前拟把归期说》
            ],
            "临江仙": [
                58, // 双调，五十八字，上下阕各五句，三平韵。宋·晏几道《临江仙·梦后楼台高锁》
                60, // 双调，六十字，上下阕各四句，三平韵。明·杨慎《临江仙·滚滚长江东逝水》
            ],
            "小重山": [58], // 双调，五十八字，前后片各四平韵。宋·岳飞《小重山·昨夜寒蛩不住鸣》
            "踏莎行": [
                58, // [正体]: 双调，五十八字，前后段各五句、三仄韵。宋·秦观《踏莎行·雾失楼台》。
                64, // [转调]: 《转调踏莎行》，双调，六十四字，仄韵。
                66, // [转调]: 《转调踏莎行》，双调，六十六字，仄韵。
            ],

            // MARK: - 中调 (59-90 字)

            "一剪梅": [60], // 双调，六十字，上下片各三平韵。宋·李清照《一剪梅·红藕香残玉簟秋》
            "蝶恋花": [60], // 双调，六十字，前后片各四仄韵。宋·柳永《蝶恋花·伫倚危楼风细细》
            "钗头凤": [60], // 双调，六十字，上下片各七仄韵，两叠韵，两部递换。宋·陆游《钗头凤·红酥手》
            "破阵子": [62], // 双调，六十二字，上下片皆三平韵。宋·辛弃疾《破阵子·醉里挑灯看剑》
            "渔家傲": [62], // 双调，六十二字，前后段各五句，五仄韵。宋·范仲淹《渔家傲·塞下秋来风景异》
            "定风波": [62], // 双调，六十二字，上阕五句三平韵两仄韵，下阕六句四仄韵两平韵。宋·苏轼《定风波·莫听穿林打叶声》
            "苏幕遮": [62], // 双调，六十二字，上下片各四仄韵。宋·范仲淹《苏幕遮·碧云天》

            "青玉案": [
                67, // 双调，六十七字，前后阕各五仄韵，上去通押。宋·辛弃疾《青玉案·元夕》
                68, // 双调，六十八字，前后阕各五仄韵。亦有第五句不用韵者。清·顾贞观《青玉案·天然一帧荆关画》
            ],
            "天仙子": [68], // 双调，六十八字，前后阕各五仄韵，上去通押。宋·张先《天仙子·水调数声持酒听》
            "江城子": [70], // 双调，七十字，前后阕格式相同，各五平韵，一韵到底。宋·苏轼《江城子·乙卯正月二十日夜记梦》
            "风入松": [
                74, // [74 字体]: 双调，七十四字，上下阙各六句，四平韵。
                76, // [76 字体]: 双调，七十六字，上下阙各六句，四平韵。宋·吴文英《风入松·听风听雨过清明》(以此为例)
            ],
            "洞仙歌": [83], // 双调，八十三字，前后片各三仄韵。宋·苏轼《洞仙歌·冰肌玉骨》

            // MARK: - 长调 (>= 91 字)

            "满江红": [93], // 双调，九十三字，前片四仄韵，后片五仄韵。宋·岳飞《满江红·怒发冲冠》
            "满庭芳": [95], // 双调，九十五字，前片四平韵，后片五平韵。宋·秦观《满庭芳·山抹微云》
            "水调歌头": [95], // 双调，九十五字，前后片各四平韵。宋·苏轼《水调歌头·明月几时有》
            "凤凰台上忆吹箫": [95], // 双调，九十五字。前段十句，四平韵；后段十一句，五平韵。李清照《凤凰台上忆吹箫·香冷金猊》
            "八声甘州": [97], // 双调，九十七字，前后片各四平韵。宋·柳永《八声甘州·对潇潇暮雨洒江天》
            "声声慢": [97], // 双调，九十七字，前后片各五仄韵。宋·李清照《声声慢·寻寻觅觅》
            "扬州慢": [98], // 双调，九十八字，押平声韵。宋·姜夔《扬州慢·淮左名都》
            "念奴娇": [100], // 双调，一百字，前片四十九字，后片五十一字，各十句四仄韵。宋·苏轼《念奴娇·大江东去》
            "水龙吟": [102], // 双调，一百零二字，前后片各四仄韵。宋·苏轼《水龙吟·似花还似非花》
            "雨霖铃": [103], // 双调，一百零三字，前后阕各五仄韵。宋·柳永《雨霖铃·寒蝉凄切》
            "永遇乐": [104], // 双调，一百四字，前后片各四仄韵。宋·辛弃疾《永遇乐·千古江山》
            "望海潮": [107], // 双调，一百七字，前片五平韵，后片六平韵。宋·柳永《望海潮·东南形胜》
            "沁园春": [
                114, // 双调，一百十四字，前片四平韵，后片五平韵。毛泽东《沁园春·独立寒秋》
                117, // 双调，一百十七字。苏轼《沁园春·情若连环》
            ],
            "贺新郎": [116], // 双调，一百十六字，前后片各六仄韵。宋·苏轼《贺新郎·乳燕飞华屋》
            "摸鱼儿": [116], // 双调，一百十六字，前段十句六仄韵，后段十一句七仄韵。辛弃疾《摸鱼儿·更能消几番风雨》
            "六州歌头": [143], // 双调，一百四十三字，前段十九句八平韵八叶韵，后段二十句八平韵十叶韵。贺铸《六州歌头·少年侠气》
        ]
    }

    /// Modern Chinese specific features
    enum Modern {
        // Common modern markers
        static let particles = [
            // Function words (功能词)
            // Common particles (常用助词)
            "的", "了", "着", "呢", "吧", "啊", "呀", "嘛", "啦", "哇",
            "哦", "哎", "欸", "呗", "唄", "嘿", "呐", "吶", "咧", "嘎",
            "哩", "咯", "喽", "嘞", "喔", "诶", "誒", "噻", "吗", "嗎",
            "么", "麼",

            // Conjunctions & Prepositions (连词和介词)
            "跟", "靠", "因為", "如果", "要是", "除非", "只要", "即使", "還是", "或者",
            "要麼", "而且", "並且", "但是", "可是", "不過", "接著", "順著", "沿著", "通過",
            "經過", "根據", "按照", "關於", "儘管", "因此",

            // Pronouns (代词)
            "你", "她", "它", "俺", "我们", "我們", "你们", "你們", "他们", "他們",
            "她们", "她們", "咱们", "咱們", "自己", "本人", "本身", "这个", "這個", "那个",
            "那個", "这些", "這些", "那些", "哪些", "这样", "這樣", "那样", "那樣", "这么",
            "這麼", "那么", "那麼", "这里", "這裡", "那里", "那裡", "这儿", "這兒", "那儿",
            "那兒", "什么", "什麼", "哪个", "哪個",

            // Verbs (动词)
            "做", "需要", "打算", "害怕", "相信", "知道", "明白", "懂得", "理解", "准备",
            "準備", "觉得", "覺得", "希望", "愿意", "願意", "喜欢", "喜歡", "讨厌", "討厭",
            "担心", "擔心", "想要", "想念", "想看", "期待", "盼望", "应该", "應該", "成为",
            "认为", "認為", "忘记", "忘記", "怀念", "懷念", "拿到", "得到", "还有", "還有",
            "拥有", "擁有",

            // Adverbs (副词)
            "很", "挺", "正在", "立刻", "稍微", "有點", "特別", "相當", "極其", "格外",
            "比较", "比較", "已经", "已經", "永远", "永遠", "常常", "时常", "時常", "一直",
            "一共", "統統", "完全", "刚刚", "剛剛", "即将", "即將", "经常", "經常", "偶尔",
            "偶爾", "偶然", "现在", "現在", "不時", "确实", "確實", "实在", "實在",

            // Common phrases (常用短语)
            "好像", "要不", "不要", "反正", "简直", "簡直", "索性", "竟然", "总算", "總算",
            "终于", "終於", "究竟", "到底", "干脆", "乾脆", "怎么", "怎麼", "顺便", "順便",
            "难道", "難道", "不对", "对不", "不對", "對不", "从前", "之前", "把把", "把握",
            "每次", "每天", "每年", "每月", "每周", "每当", "每當", "每把", "每每", "这是",
            "就是", "问题", "問題", "行不行", "差不多", "看起来",
        ]
    }
}
